谦恭的程序员——图灵奖得主迪杰斯特拉,每位程序员都该读一读,包含最初的程序员的职业感受,以及一些语言和软件历史的认识
点击上方“图灵人工智能”,选择“星标”公众号
您想知道的人工智能干货,第一时间送达
迪杰斯特拉(Edsger Wybe Dijkstra,1930年5月11日-2002年8月6日),男,出生于荷兰鹿特丹,毕业于荷兰Leiden大学,荷兰计算机科学家。他是计算机先驱之一,是Dijkstra最短路径算法和银行家算法的创造者,开发了程序设计的框架结构,曾获得图灵奖等奖项。2002年8月6日,艾兹格·迪科斯彻在荷兰逝世。
本文摘自ACM图灵奖委员会主席M·D·麦希尔洛伊宣读的图灵奖授奖声明,1972年8月14日在波士顿的ACM年会上发表演讲时。
各处的程序员的工作词汇都散布着由迪杰斯特拉所创建和强有力地传播的词汇——显示、死锁、信号灯、较少GOTO的程序设计、结构程序设计。但他对程序设计的影响要比任何词汇所能表示的更为深入。这个图灵奖要感谢的珍贵礼物是迪杰斯特拉的风格:他把程序设计作为一个高度智力挑战的方法;他雄辩地坚持和实际地论证,应当正确地编写程序,而不仅仅把程序调试成正确的;以及他在程序设计的基础上对于问题的有启发的感知。他已发表了大约十余篇论文,既有技术性的,也有思考性的,其中特别要指出的是他在国际信息处理联合会(IFIP)上的哲学演讲,他关于合作顺序进程的已成为经典的论文,以及他关于GOTO语句的令人难忘的控告。迪杰斯特拉所写的有影响的信件最近作为关于编写程序的艺术的漂亮专著出版。
我们像评价好的著作一样来评价好的程序,而在这一运动的中心,迪杰斯特拉坚持创建和思考既有用又不乏美丽的模式。
1952年的头一个春天的清晨,在经历了长时间的巧合之后,我正式地进入程序设计这个专业。而且就我的追忆而言,我是荷兰的头一个程序员。就我的记忆所及,至少在我所处的那个世界,最有趣的事情是程序设计专业出现的缓慢性。这种缓慢性是现在难以相信的。但我决无任何怀疑地对于建立这个缓慢性的历史时期缅怀感激,这是由两个生动的回忆所致。
在从事程序设计大约三年后,我和范·温加尔登(van Wijngaarden)有一次面谈,他后来成了我在阿姆斯特丹数学中心的上司——这是一次令我永远感激的面谈。谈话的要点是让我同时在莱登(Leiden)大学学习理论物理,而由于我发现这两项活动越来越难以组合在一起,我必须下决心,要么停止程序设计,努力成为一个受人尊敬的理论物理学家;要么做我的物理研究直到形式上完成为止,而且只须花费极少的努力来成为……成为什么呢?变成一名程序员吗?这是一个受人尊敬的行业吗?终究,什么是程序设计?支持它作为知识上可受人尊敬的领域的健全知识体在哪里?我仍十分清楚地记得,当问及我的硬件同事们关于他们专业的竞争性时,我对他们何等羡慕,因为至少有一点,即他们知道关于真空管、放大器及其他每一件事,而我感到,当面对这些问题时,我将是空手的。当我敲范·温加尔登的办公室的门时,我充满疑虑,我问他可不可以和他说几句?离开他办公室之后几个小时,我就变成另一个人了。在耐心地听了我的问题之后,他同意,直到那时为止,还没有多少程序设计学科,然后他平静地说明,自动计算机已经就在我们身边,我们还处于开始阶段,因而为什么我不可以是在未来岁月中使程序设计成为可尊敬的学科的人之一呢?这在我的一生中是一个转折点,因而我尽可能迅速并正式地完成我的物理学习。当然,上述故事的教益是,当我们向年轻人提出忠告时必须非常小心,有时他们是遵循它的!
两年后,1957年,我结婚了。荷兰人结婚的习俗是你要说明你的专业,因此我声明我是一名程序员。但是阿姆斯特丹市的市政当局不接受它,因为没有这样的专业。因此,信不信由你,在我的结婚记录中,我的“职业”一栏荒唐地写着“理论物理学家”!
关于在我的国家里程序设计专业出现的缓慢性就谈这些。自那以后,我看到更多的世界,在其他国家里,我总的印象是,除了可能的日期的改变外,其成长的模式都和这差不多。
让我再尝试来更详细地介绍旧时的一些情况,以期对今天的情况有更好的了解。虽然我们在进行分析,但应当看到,关于程序设计的真正本质有多少普通的误解却可追溯到遥远的过去。
最初的自动电子计算机都是独一无二的、单台的机器,而且它们全都可在具有令人兴奋的风味的一个实验室环境中找到。一旦有了自动计算机的视野,它的实现对于可利用的电子技术就成为一个巨大的挑战,而且有一件事就成为肯定的:我们不能拒绝决定来尝试构造这样一个奇妙装置的人群的勇气。对于这种奇妙的装置它们是:回想中,人们只能惊讶,这些最初的机器全都能行。至少在一段时间里,压倒一切的问题是使得这个机器处于和维持在工作状态中。对于自动计算的物理方面的偏见仍然反映在这个领域中较老的科学学会的名称中;例如计算机器协会或英国计算机学会,这些名字明显地提及物理装置
可怜的程序员如何呢?好,诚实地说,他很难被注意,因为,最初的机器都是庞然大物,你几乎动不了它。而且除此之外它要求如此广泛的维护,因此十分自然的,在人们试图使用这些机器的地方,那就是研制这个机器的地方。其次,程序员的无论怎么说都看不见的工作是没有任何基础的,你可以向参观者展示机器,并且其数量级要比几张代码更惊人。但在这一切当中最为重要的是,程序员对于他自己的工作有一个非常谦虚的观点,他的工作因美妙机器的存在而重要。由于这是独一无二的机器,他深知,他的程序只具有局部重要性,而且还因为它一清二楚地显示,这台机器将只有有限的生命。因此他知道,他的工作只有很少一点可以有长久价值。最后,还有另一个环境,是对程序员对自己的工作态度有长远影响的:除不可靠外,一方面,他的机器通常太慢,而内存通常太小,即他面对的是难穿的鞋。而另一方面,它稍微古怪的代码将迎合大多数非预期的构造。在那些日子里,许多机灵的程序员由狡猾的技巧导出无限知力的满足。借助于它,他设法把不可能挤压成为他的装置的限制。
关于程序员有两个意见是从那些日子开始的。我现在来把它们提出来,过会我还会再谈及它们。一个意见是,真正有竞争力的程序员应该是喜欢解难题并非常喜欢机敏的技巧的;另一个意见是,程序设计不外乎是在某个方向来优化计算过程的效率。
后一条意见是下列经常情况的结果,即,确实,那时可利用的装备是痛苦的、扎脚的鞋,在那些岁月中,人们经常碰到天真的期望,即一旦有了更强有力的机器,程序设计就将不再是一个问题了。因为把机器推向其极限的奋斗也将没有必要了,而这正是程序设计之全部任务。不是吗?但在之后的几十年中完全不同的事情发生了,更强有力的机器出来了,不仅仅是更强有力一个数量级,而是更强有力好多个数量级。但是代替发现我们自己处于为所有程序设计问题都被解决的狂喜状态,我们发现自己深陷于软件危机之中!怎么回事?
有一个极小的原因:在一两个方面,现代机器基本上来说比旧的机器更难于处理。首先,我们有输入输出中断,它们在不可预料、不可再现的时刻出现;与装着是完全确定的自动机的旧串行机器相比,这是一个巨大的变化,而且许多系统程序员的白发证实了下列事实,关于由这个特性所建立的逻辑间题,我们不宜轻松地去谈论之。其次,我们已经有了以多级存储装备起来的机器,这提出了管理策略的问题,即,尽管关于这个课题有大量的参考文献,但它们仍然是模糊的。关于由于实际机器结构变化引起的额外的复杂性,就谈这些。
但我把这称为一个小的原因:重大的原因是……机器已经变成更强有力好多个数量级。直截了当地说,只要没有机器,程序设计就根本没有问题,当我们有一些弱的计算机时,程序设计变成一个温和的问题,而现在我们有了庞大的计算机,那么程序设计也变成为同样庞大的问题。在这个意义下,电子工业还没有解决一个问题,它仅仅去创建它们——它创建了使用它的产品的问题。再从另一方面来说,由于可利用的机器的威力增长达1000倍以上,应用这些机器的社会雄心也按比例地增长,而可怜的程序员发现自己的工作处于极端和平均之间的紧张区域之中。硬件增长的威力,连同它在可靠性方面或许更巨大的增长,使得问题的解成为更可行。在一些年前,程序员对它们连想都不敢想,而现在,一些年之后,他已经敢去梦想它们,甚至更糟的是,他已经把这样的幻想转换成现实!我们发现我们处于软件危机之中,这是一个奇迹吗?不,肯定不是!而且正如你可能猜测的那样,事先就预测到它;但当然对于有小的预测的麻烦是,仅仅过了5年之后,你才真正知道它们是对的。
然后,在20世纪60年代中期,某些麻烦出现了,所谓第三代计算机登台亮相。正式的文献告诉我们,它们的性价比是主要设计目标之一。但如果把机器各种部件的责任周期记作性能,那么阻止你结束一个设计的可能性很小。在这个设计中,你的性能目标的主要部分是通过必要性可怀疑的内部簿记活动达到的。如果你对于价格的定义是对硬件要付的价格,那么防止你去结束一个这样的设计的可能性很小,这个设计极难以编程。例如,命令代码可能是对程序员,或者对系统的强制,早期的约束决定代表了实际上解决不了的冲突。在更大范围内说,这些不愉快的可能性似乎都变成了现实。
当这些机器被宣告且它们的功能说明书也被公之于众后,我们中许多人必定变得极不愉快,至少我是这样。仅有的合理预期是,这样的机器将在计算机界泛滥,因此最为重要的是它们的设计应当尽可能地好。但是这个设计体现了严重的缺陷,这就是,我感到,通过一个打击,计算科学的进步已被延缓至少十年;正是在那时,在我整个专业生涯中,我度过了最黑暗的一周。或许现在最可悲的事情是,即使在所有这些年令人感伤的经验之后,仍然有这么多的人们真诚地相信,某个自然规则告诉我们,机器应该是这样子。他们通过观察有多少这样的机器被卖出而对他们的怀疑保持沉默,而从这些观察导出错误的安全感,毕竟,这个设计不可能是那么坏的。但在更仔细的观察之后,防线已经和论证有相同的令人信服的强度,即抽烟必定是有益健康的,因为那么多人都在抽。
正是在这样的联系中,我感到遗憾的是,计算领域中的科学杂志不习惯于以像我们评论科学出版物那样来评论最新发布的计算机:至少对机器进行评论将是同样重要的。在这里我要承认,20世纪60年代初期我曾写过这样的评论,并且有意投到Communications去,但尽管有这样的事实,我把稿件寄给少数同事征求意见,他们鼓励我这样做。但我不敢,怕对我本人造成困难,或者让编辑部遭受到这样的困难,而它将证明这种困难是极大的。这种忍让在我这方面来说是怯弱的举动,为此我越来越责备自已。而我预测的困难是缺乏普遍接受的原则的结果。尽管我确信我选定的准则的正确性,但我害怕,我的评论将被拒绝或者作为“个人感受的”而被抛弃。我仍然想,这样的评论将是极其有用的,因而我渴望它的出现,因为如果它们被接受了,那将是计算界成熟的毫无疑问的标志。
对硬件方面投入这么大的精力,是因为我有这样的感觉:任何计算工具最重要的方面之一是,对于那些尝试使用它的人们的思考习惯将产生影响,而且还因为我有理由相信,这个影响要比一般认为的强许多倍。现在让我们把注意力转到软件方面。
在这里,差异是如此巨大,因而我必须将自己限制于一些台阶上。我痛苦地知道我的选择的任意性,因而我还请求你们不要对于我对许多努力所做的评价做出任何结论,这些努力将不被提及。
开始时,曾有英国剑桥的EDSAC,我想它是令人印象深刻的,因为从一开始,子程序库的思想就在该机器的设计中起着重要作用,而且在对它的使用中也贯彻了这一思想。现在,已经过去了将近25年了,计算方面也有了很大变化,但基本软件的思想仍然保持不变,而且封闭的子程序的思想仍然是程序设计中关键的概念之一。我们应承认,封闭的子程序是最伟大的软件发明之一;它已经经历了计算机的第三代且还将经历更多代,因为它适合于我们基本抽象模式之一的实现。非常遗憾,在设计第三代计算机时,它的重要性曾被低估,其中大量明确命名的运算器的寄存器,意味着在子程序机制上的很大开销。但即使如此也未扼杀子程序的概念,因而我们只能祈祷,变异将证明不是遗传的。
我乐意提及的软件方面的第二个重要发展是FORTRAN的诞生。那时,它是很鲁莽的一个项目。负责该项目的人们值得我们敬仰。仅仅在广泛地用了十余年之后它的缺点才变成明显的,由此而谴责他们是绝对不公平的。能成功展望未来十年的人们是极其稀少的!在回顾时,我们必须把FORTRAN评为成功的编码技术,但对于概念提供非常少有效的帮助,这是现在迫切需要的帮助。因而现在认为它们过时了。如果我们能够尽快忘记FORTRAN曾存在过,则情况会更好,因为作为思考的工具,它不再是适合的:它浪费我们的脑力资源,因而使用它既冒险又昂贵。FORTRAN的悲剧是对它广泛的接受,在智力上把成千上万的程序员链接到我们过去的错误上。我每天都祈祷,更多的程序员同行能找到使他们自己从兼容性的罪恶中解放出来的方法。
我想提及的第三个项目是LISP,这是性质上完全不同的一个极富魅力的事业。通过其基础上的一些基本的原理,它已显示了引人注目的稳定性。除此之外,在某种意义下,LSP已成为大量最复杂的计算机应用的我体。LISP已被开玩笑地说成是“盗用计算机最智能的工具”。我想这个描述是极大的赞美,因为它传递了完全的解放的风味:它在进行以前认为不可能的思考中给我们一些最有天才的同行以帮助。
第四个要提的项目是ALGOL 60,虽然直到今天为止FORTRAN的程序员仍然趋向于借助他们进行工作——因此而流行的八进制或十六进制的特定实现来理解他们的语言,而LISP的定义仍然是语言意味着什么和机器如何工作这两者的奇怪的混合。著名的《算法语言ALGOL 60的报告》,是把抽象化推进重要一步和以同实现无关的方式来定义一个程序设计语言的天才努力的成果。人们可以论证,在这个方面,它的作者们已经达到了如此巨大的成功,以致他们对于这个报告能否被实现产生了严重的怀疑。这个报告光荣地显示了形式方法BNF,即现在相当有名的Backus-Naur范式,以及显示措辞严密的英语的威力,至少当为像Peter Naur这样智能超群的人们使用时。我想,这样说是公平的。像这样短的文件而对计算界有这样的深远影响者,为数很少。随后岁月中ALGOL和类似ALGOL这样的名称作为一个未受保护商标的方便使用,把荣誉提供给一些有时几乎无关的较新的项目,对于ALGOL的身份来说是一个很坏的恭维。BNF作为一个定义手段的长处应对我认为的该语言的弱点之一负责:过于矫揉造作和不太系统的语法现在可能被塞进非常少篇幅的限制中。通过像BNF这样强有力的手段,关于算法语言ALGOL 60的报告应该更短得多。此外,我现在对于ALGOL 60的参数机制越来越怀疑,它允许程序员有这么多组合的自由,因而它的确信的使用要求来自程序员很强的纪律性,除了实现方面的昂贵之外,似乎用起来也危险。
最后,尽管这不是一个愉快的主题,但我必须提及PL/I,这是其定义文档令人惊讶地长而复杂的一种程序设计语言。使用PL/I必须像是在飞机座舱里操作具有7000个按钮、开关和把手的飞机。我绝对看不出,当通过它的全然怪诞性,对不起,我们的基本工具——程序设计语言已经逃离我们的智力控制时,如何能够牢固地在我们智力的掌握之下来保持程序的增长!而如果我要描述PL/I对其用户的可能影响时,在我的脑海中出现的最接近的比喻是一种药。在关于高级程序设计语言的一次讨论会上,我记得听到由某个自称是PL/I的用户所做为PL/I辩护的报告。但在他赞扬PL/I的一小时的报告中,他设法去要求增加50个新的“特征”;做点假设,他的问题的主要来源可能在于已经包含了太多的特征了。这位演讲者显示了所有令人沮丧的癖好的症状,归结为他正处于脑袋停滞的阶段。其中他仅仅能够要求更多、更多、更多…。当FORTRAN曾被称为幼稚的混乱时,完全的PL/I,连同它危险的肿瘤的增长特征,可以转而成为致命的疫病。
关于过去就谈这些。但是除非今后我们能从中去学习,否则仍会犯错误。事实上,我想,我们已经学到这样多,因此在一些年之内程序设计可以成为同直到现在为止完全不同的活动。它是如此地不同,因此我们最好做好准备以免大吃一惊。让我勾勒一下一个可能的未来。首先,在或许已经靠近的未来,程序设计的视野可能给你完全不现实的印象。因此让我也补充一些考虑。这些考虑可能使人们得出结论,即这个视野可能有一个非常实际的可能性。
这个视野是这样的,即在20世纪70年代结束之前,我们就将能够设计和实现某种类型的系统,它在现在我们所花费的人年费用的小百分比的代价之下,就竭尽我们程序设计的能力了,而且除此之外,这些系统实际上将是无错误的。这两项改进是肩并肩地实现的。在这后一个方面,软件似乎不同于许多其他产品,对于它们而言,一个规律是,质量越高,价格越高。希望获得真正可靠软件的人将发现,他们首先必须从找到避免大多数错误的方法开始,而且其结果是,程序设计的过程将变得更便宜。如果你想要更有效的程序员,你将发现,他们不应该把时间浪费在调试上一他们不应当以引进错误开始。换句话说,两个目标指向同一个改变。
在这样短时间内的这样巨大的变化将是一个革命,而且对于所有把自己对未来的期望都建立在对最近过去的平稳扩展上的人们来说——他们感兴趣于某些社会和文化惯性的非书面规律一这个巨大变化发生的几率必定是可以忽略的。但我们都知道,有时革命确实会发生!而对于这个来说,机会会是怎样的呢?
看起来有三个主要条件必然会实现。整个来说,这个世界必定会认识到对这个改变的需要;其次,对于它的经济需要必定是足够强的;第三,这个改变在技术上必定是可行的,让我按以上顺序来讨论这三个条件。
关于对软件更大可靠性的需要的认识问题,我预料不会有任何异议。但仅仅是在一些年前,这是不同的:谈及软件危机是贬亵神祗的。转折点是1968年10月在Garmisch召开的软件工程会议,这次会议由于出现了对软件危机的头一次的承认而产生轰动。因此现在一般都承认,设计任何大型复杂系统将是一件非常困难的工作。因而每当碰到负责这样的重任的人时,人们发现他们非常关心可靠性的问题。事实确实如此。简言之,我们的头一个条件似乎被满足了。
现在谈经济的需要。现在人们经常遇到这样的意见,即在20世纪60年代,程序设计已经是一个高薪职业,因而在未来的岁月中程序员的工资预料可能会下降。通常这个意见是在同衰退相联系时表达的,但是它也可能是不同的和十分健康的某种事物的症状。即是说,也许过去十年程序员没有如他们应当做到的那样做他们的工作。社会逐渐对程序员的表现和他们的产品感到不满:但还有另一个分量更重的因素,在当前的情况下,十分通常的是,对于一个具体的系统,开发软件所支付的价格和所需硬件的价格是同一个数量级,因而社会或多或少地接受了。但是硬件厂家告诉我们,在未来十年里,预料硬件价格会下降10的一个因子。如果软件的开发仍然像它现在这样是制作相糙和昂贵的过程,那么事情就会完全失去平衡,你不能期望社会接受这一点。因此我们必须学会更有效地对一个数量级编程。换句话说,只要机器是预算中最大的开支项目,程序设计专业就可以离开它粗制滥造的技术,但是雨伞将快速地折叠。简言之,我们的第二个条件似乎也满足了。
现在来谈第三点,它在技术上可行吗?我想,可能可行。我将给出6个论点以支持这个观点。
对程序结构的研究已经揭示,程序——甚至对于同样任务的另一个选择的程序,以及对于相同的数学内容,在他们的智力可管理性方面可以有很大不同。人们已经发现一些规则,对于这些规则的违反或者将严重地阻碍或者全然破坏程序的智能的可管理性。这些规则有两类,对于头一类的那些规则可容易地从机械上加以实施,也就是说,通过适当选择的程序设计语言,例子是排除GOTO语句以及具有一个以上输出参数的过程语句。至于第二类,至少我看不出机械地实施它们的方法一或许是由于我在这方面缺乏竞争力,因为它似乎需要某种自动的定理证明程序面对它,我还没有存在性证明。因此,对于现时而言或许永远如此,第二类规则把它们自己表现成为程序员所要求的学科的组成部分。在我脑海中已有的某些规则已经是如此清晰,因而它们已可加以讲授,也就决不需要再去论证一个给定的程序是否违反它们。例子是如果不提供终止的证明,或者如果不指出其不变量关系将不会为可重复语句的执行而遭破坏,就不应写下循环语句。
我现在提议,在设计和实现智力上可管理的程序时,应对我们自己加以限制。如果某人害怕,这个限制太苛刻了,有了它我们就活不了,我可以让他放心,智力可管理程序的类仍然是丰富的,足以包含对于有能力提供算法上解的任何问题的许多非常现实的程序。我们必须不要忘记,编写程序不是我们的业务。我们的业务是设计将显示一个合意特性的计算类。限制我们自己来设计智力可管理程序的建议是我宣告的6个论断的头两个的基础。
论断一是,由于程序员仅仅需要考虑智力上可管理的程序,他从中可选择的替代者对付起来要容易得多。
论断二是,只要我们已决定把自己限制于智力上可管理的程序的主题,就可以一劳永逸地大大压缩要考虑的解的空间。因此这个论证不同于论证一。
论断三是,基于程序正确性问题的构造性方法。现在常用的技术是编写一段程序而后测试它。程序测试可能是证明错误存在的一个非常有效的方法,但是对于证明错误不存在来说是绝对不足够的。唯一有效的可显著提高对一个程序信任程度的方法是,对它的正确性给出令人信服的证明。但是人们不应该首先编写程序而后证明正确性,因为提供证明的要求将仅仅增加可怜的程序员的负担。反过来,程序员应该让正确性证明和程序的合成同时进行。论证三实质上基于以下的观察:如果某人首先问自己,一个令人信服的证明的结构是什么。找到了这个之后,再去构造满足这个证明要求的程序,然后这些正确性的考虑就会成为一个非常有效的带启发探素的指南。根据定义,这个方法仅当我们限制自己于智力上可管理的程序时才可用,但它提供了在这些当中找出令人满意的一个的有效工具。
证四涉及为设计一个程序所需要的智力努力的数量依赖于程序长度的方法。我们已经提出,有某种自然规则告诉我们,需要的智力努力的数量按程序长度的平方而增长。但是,天啊,无人能够证明这个规律;而且这还因为它未必是真的。大家都知道,一个有限块的推理可以覆盖无数情况的唯一思维工具称为抽象,结果,抽象的威力的有效利用必须被认为是一个有能力的程序员最为重要的活动之一。在这方面,可能还值得指出,抽象的目的不是模糊而是创建一个新的语义。其中,人们能够绝对地精确。当然,我已经试图找出这样的一种基本情况,即它妨碍我们的抽象机制成为充分有效的。但是无论如何艰难地尝试,我都找不到这样一种情况。结果,我试图做这样的假定——直到现在为止,它都未被经验所否定——即通过适当地应用我们的抽象的威力,想象和理解一个程序所要求的智力努力无须比同程序长度成比例的增长还要更高些。这些观察的一个副产品可能有更大的实际意义,而且它是我的第四个论证的基础。这个副产品是在整个编制程序过程中起着重要作用的一些抽象模式的标识。关于这些抽象模式,只须知道这样一点就够了,即对于其中每一个,你可以讲授一堂课。这些抽象模式的熟悉性和知觉的知识所意味的终于使我理解,我认识到,15年前,假如这些已经成为普通常识的话,例如,从BNF到面向语法的编译程序这样一步,可能只要花上几分钟,而不是几年。因此,我把我们现在关于重要抽象模式的知识当作第四个论证。
现在是第五个论证:它同我们尝试使用的工具对我们思维习惯的影响有关。我观察一种文化传统,在所有概率方面它都源于文艺复兴。忽略这个影响,把人类的思想当作它的制造物最高和自动的主宰,但如果我开始来分析我自己和我的同事的思维习惯,无论愿意不愿意,我都得出完全不同的结论。也就是说,我们尝试使用的工具和语言或者用来表达或记录我们思维的记号,全然是我们能够思考或表达的东西的重要因素!程序设计语言对用户思维习惯的影响的分析,以及认识到人脑的威力是我们最稀缺的资源,这些一起给了我们比较各种程序设计语言的相对优点的新集合。有能力的程序员完全知道自己的头脑的极为有限的尺寸;因此他以完全谦恭的态度来解决程序设计任务。而且在其他事情当中,他避免像祸患这样灵活的技术。在有名的会话式程序设计语言的情况下,各方面都向我说起,只要程序设计界都装备上终端,一个特定的现象就会出现,即甚至有一个确定了的名称,它称作“一行程序”。它的两种形式之一:一个程序员在另一个程序员的磁盘上放置行程序,而且或者得意地告知它是做什么的并加上问题:“你能以更少的符号来编写吗”——就好像这是任何概念或者他仅仅说,“猜猜看它做什么”。从这个观察,我们必定做出这样的结论,即作为一个工具,这个语言是机巧的一个开放的吸引力;然而尽管这对于它的某些吸引力可能是某种精确说明,即对于那些想要显示他们是如何机灵的人们而言也可能是这样,但很抱歉,我必须把这当作关于程序设计语言可以说的最可诅咒的事情之一。从最近的过去我们必须汲取的教训是无论在机械上还是在智力上,奇形怪状的庞然大物中,各种特性的混合体,实际上都是不可管理的。在这种意义下,研制“更丰富”或“更强有力”的程序设计语言是一种错误。那些非常系统和非常有节制的语言,我认为有很好的未来。当我说“有节制时”,我指的比如说,不仅是ALGOL的for短句,而且包括FORTRAN的Do loop,可以发现就因为它们太奇特了而被抛弃。我已对真正有经验的志愿者做了一个小的程序设计实验,但某些事情十分出乎意料,并有始料未及的结局。我的志愿者中没有一个人找到明显的和最优的解来。当更仔细地分析后,发现这原来有一个公共的来源:他们关于重复的思想太过紧密地同要加以步进的一个相关联的控制变量的思想有关,即他们思想上被阻碍以致看不到明显的解。他们的解不大有效,不必要地难以理解,而且他们都花了很长时间才找到它们。它对于我是一个揭示,但也是一个震惊的体验。最后,在某个方面,人们希望明天的程序设计语言将在很大程度上不同于我们今天所习惯的;在比迄今更大的程度上,它们应当邀请我们来反思为了在概念上对付我们设计的复杂性时需要的所有抽象的结构。关于未来工具更大的适应性就谈到这里,这是第五个论证的基础。
附带地,我愿意插入对一些人的警告,他们用针对我们当前工具的不适当性的奋斗来标识程序设计任务的困难性,因为他们可能得出结论说,一旦我们的工具更大时,程序设计将不再是一个问题。程序设计工作将仍然非常困难,因为一旦我们已经从繁文缛节的烦琐中解放出来,也将发现我们也能自由地去处理现在超出程序设计能力的那些问题了。
你可能要因我的第六个论证同我争吵,因为搜集支持它的经验证据不是那么容易,但这不是阻止我相信其正确性的一个事实。迄今为止,我还未提到“层次”这个词。但是我想,公平地说,对于体现一个可分解的解的所有系统而言,这是一个关键的概念。我甚至可以进一步写一篇关于它的真实性的文章。这就是说,我们真正能以令人满意的方式求解的仅有问题是最终允许很好地分解的解。起初,这个关于人的局限性的观点可能会使你对我们的困境留下稍微令人沮丧的印象,但我并不这样想。相反,学会在局限性之下生活的一个最好方法是了解它们。现在我们充分有节制地仅仅来尝试可分解的解,因为其他的努力都将使我们离开智力的掌握程度,我们应尽最大努力避免妨碍我们以有帮助的方式来分解系统的能力的所有那些界而。我只能期望这将反复地导致我们发现。一个开始时不可解的同题最终可以被分解。任何一位已看到称为“代码生成”的编译阶假的大多数麻频都可追查到有序代码的有趣性质的人们,都将知道我脑子里想的这类事情的一个简单例子。可分解的解的广泛可应用性,是我关于当前十年中可储发生的创新技术能行性的第六个也是最后一个论证。
原则上,对我的考虑如何评价,我留给你们自己来决定。我十分清楚,我不可能强迫任何人人接受我的信念。由于在每个严重革命中,都将唤起强烈的反对者,因此每个人都可问-一问自己,保守的力量在哪里试图来反对这样一个发展。我主要是在大的事务中不期望他们,甚至也不在计算机的事务中:我宁可期望他们是在提供今天的训练的教育机构中,以及在保守的计算机用户群体中、因为他们会想他们的老程序是如此重要,因此他们不认为值得重写和改进它们。在这方面,很可悲地说,在许多大学校园中,对中央计算设施的选择经常由一些既有的昂贵应用所确定,而且不理睬这样的问题,即有成百上千个希望来写他们自己程序的“小用户”将由于这个选择而遭殃。例如,高能物理似平太经常地以它剩余的实验装备价格来对科学界进行讹诈。当然,最容易的答案是简单拒绝技术能行性。但我担心,对此你需要有很强的论证。天啊,不可能从这样的评论得到放心,即今天中等程序员的智力将防止革命的发生。通过其他如此更有效的程序设计,他无论如何有从这个形势中被挤出的可能。
还有政治上的障碍,即使我们知道怎样来教育明天的专业程序员,但我们所处的社会不一定允许我们这样做。讲授一个方法学——而不是传播知识——头一个效果是提高已经有的能力,于是加上智力上的差别。在教育系统被用作建立协调文化的一个机构的社会里,其中防止物体上升到顶头上,对有能力的程序虽的教有可能在政治上是令人讨厌的。
现在让我来总结一下。自动计算机已经同我们一起经历四分之一世纪了。它在它们工具的能力上对我们的社会有重大影响,但在该能力上它们的影响将仅是在我们文化表面上的涟漪而已,如果同智力桃战方面它们将有的深远得多的影响相比的话,它们在入类文化历史上将是没有先例的。层次系统似乎有这样的性质,即在一个级别上被认为不可分的一个实体,在具有更大细节的下二个实体上被认为是合成的对象结果,当我们的注意力从一个级别转移到下一个较低级别时。在每个级别中可应用的空间或时间的自然颗粒减少一个数量级。我们借助于砖知道墙,借助于分子知道结晶体,等等。结果,在一个层次系统中可以有意义地区分级别数,是同最大和最小颗粒之间的比例的对数成比例的一类,因此除非这个比例很大,否则我们一不能期望有太多的级。在计算机程序设计中,基本结构部件有少于1微秒的相对微小颗粒,但我们的程序可能花费几小时的计算时间。我不知道任何其他技术包括或更高的比例。计算机,由于它的绝妙速度,似乎是头一个东西为我们提供这样一个环境,其中高度有层次的制造物既有可能又有必要。这个桃战,就是同程序设计任务的对抗,是如此地独一无二,即这个初始的经验能向我们讲授我们自己的许多事情。它将加深我们对于设计和创造过程的理解,它也将给我们对于组织我们思维的任务的更好控制。如果它不这样做,我认为我们将全然不值得拥有计算机!
它已经给了我们一些教训,我在这个演讲中已经选择来强调的是如下这些假定我们以对于它的巨大困难的充分理解来解决任务,假定我们坚持有节制和优雅的程序设计语言,假定我们尊重人类思维固有的极限和作为非常谦虚的程序员来解决任务,那么我们将做更好的程序设计工作。
版权声明
往期精彩必读文章(单击就可查看):
1.图灵奖得主Hamming的22年前经典演讲:如何做研究,才能不被历史遗忘
2.当这位70岁的Hinton老人还在努力推翻自己积累了30年的学术成果时,我才知道什么叫做生命力(附Capsule最全解析)
3.你为什么获得不了图灵奖,原来本科学的是计算机专业,数据显示历届图灵奖得主当中竟然只有三位在本科时主修计算机专业......
4.图灵奖得主Jeff Ullman直言:机器学习不是数据科学的全部!统计学也不是
5.魔幻现实!英国百年名校认为基础数学没用,要裁掉数学系补贴AI研究,图灵听后笑了笑
7.图灵奖得主长文报告:是什么开启了计算机架构的新黄金十年?